<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>859. 亲密字符串</title>
  </head>
  <body>
    <script>
      // 给你两个字符串 s 和 goal ，只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果，就返回 true ；否则返回 false 。
      // 交换字母的定义是：取两个下标 i 和 j （下标从 0 开始）且满足 i != j ，接着交换 s[i] 和 s[j] 处的字符。
      // 例如，在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。

      // 示例 1：
      // 输入：s = "ab", goal = "ba"
      // 输出：true
      // 解释：你可以交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba"，此时 s 和 goal 相等。

      // 来源：力扣（LeetCode）
      // 链接：https://leetcode-cn.com/problems/buddy-strings
      // 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
      // ----------------------------------------------
      // 分析：只能交换一次，俩个字符之间互换
      // 情况一. 字符串相等且存在相同字符
      // 情况二. 只有俩个字符不同，交换后相等
      var buddyStrings = function (s, goal) {
        let sLen = s.length
        let goalLen = goal.length
        if (sLen !== goalLen) return false
        let arrS = s.split('')
        let arrGoal = goal.split('')
        // 数组去重  (通过数组去重判断字符串内有无重复元素)
        let arrSOnly = [...new Set(arrS)]
        if (arrSOnly.length < sLen && s === goal) return true
        let n = []
        for (let i = 0; i < sLen; i++) {
          if (arrS[i] !== arrGoal[i]) {
            n.push(i)
          }
        }
        if (n.length !== 2) return false
        if (arrS[n[0]] === arrGoal[n[1]] && arrS[n[1]] === arrGoal[n[0]]) return true
        return false
      }

      console.log(buddyStrings('ab', 'ba'))
    </script>
  </body>
</html>
